package com.example.demo.util;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class XMLUtil {
    private static Logger logger = LoggerFactory.getLogger(XMLUtil.class);

    public static Map parseXml(String message) throws DocumentException {
        Map<String, String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        Document document = reader.read(message);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList) {
            map.put(e.getName(), e.getText());
        }
        return map;
    }


    public static Map parseXml(InputStream is) throws DocumentException {
        Map<String, String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        Document document = reader.read(is);
        String message = document.asXML();
        logger.info("收到消息：" + message);
        // 得到xml根元素
        Element root = document.getRootElement();
        // 得到根元素的所有子节点
        List<Element> elementList = root.elements();
        // 遍历所有子节点
        for (Element e : elementList) {
            map.put(e.getName(), e.getText());
        }
        return map;
    }

    /**
     * 生成xml方法
     */
    public static String createXml(Map<String, String> map) {
// 1、创建document对象
        Document document = DocumentHelper.createDocument();
// 2、创建根节点rss
        Element rss = document.addElement("xml");
// 3、向rss节点添加version属性
        // rss.addAttribute("version", "2.0");
// 4、生成子节点及子节点内容
        map.forEach((m, n) -> {
            Element channel = rss.addElement(m);
            channel.setText(n);
        });
// 5、设置生成xml的格式
        OutputFormat format = OutputFormat.createPrettyPrint();
// 设置编码格式
        format.setEncoding("UTF-8");
        return document.asXML();
    }

    /**
     * 生成xml方法
     */

    public static String createXmlStr(Map<String, String> map) {
        map.put("CreateTime", String.valueOf(System.currentTimeMillis() / 1000));
        StringBuffer sb = new StringBuffer();
        sb.append("<xml>");
        map.forEach((m, n) -> {
            sb.append("<").append(m).append(">")
                    .append("<![CDATA[")
                    .append(n)
                    .append("]]>").append("</").append(m).append(">");
        });
//        sb.append("<").append("CreateTime").append(">")
//                .append(System.currentTimeMillis() / 1000).append("</").append("CreateTime").append(">");
        sb.append("</xml>");
        logger.info("返回消息：" + sb.toString());
        return sb.toString();
    }

    public static void main(String[] args) {
        Map<String, String> map = new HashMap<>();
        map.put("ToUserName", "openID");
        map.put("FromUserName", "serviceId");
        map.put("MsgType", "text");
        map.put("Content", "hi,你好");
        String ss = XMLUtil.createXmlStr(map);

        System.out.println(ss);
    }
}